package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

type RequestBody struct {
	// alertmanager传来的请求体
	Receiver          string               `json:"receiver"`
	Status            string               `json:"status"`
	ExternalURL       string               `json:"externalURL"`
	Version           string               `json:"version"`
	GroupKey          string               `json:"groupkey"`
	TruncatedAlerts   float64              `json:"truncatedAlerts"`
	Alert             []ReqAlert           `json:"alerts"`
	GroupLabels       ReqGroupLabels       `json:"groupLabels"`
	CommonLabels      ReqCommonLabels      `json:"commonLabels"`
	CommonAnnotations ReqCommonAnnotations `json:"commonAnnotations"`
}

type ReqAlertLabel struct {
	Alertname string `json:"alertname"`
	Instance  string `json:"instance"`
	Job       string `json:"job"`
	Severity  string `json:"severity"`
}

type ReqAlertAnnotations struct {
	Description string `json:"description"`
	Summary     string `json:"summary"`
}

type ReqGroupLabels struct {
	Alertname string `json:"alertname"`
}

type ReqAlert struct {
	Status       string              `json:"status"`
	StartsAt     string              `json:"startsAt"`
	EndsAt       string              `json:"endsAt"`
	GeneratorURL string              `json:"generatorURL"`
	Fingerprint  string              `json:"fingerprint"`
	Labels       ReqAlertLabel       `json:"labels"`
	Annotations  ReqAlertAnnotations `json:"annotations"`
}

type ReqCommonLabels struct {
	Alertname string `json:"alertname"`
	Instance  string `json:"instance"`
	Job       string `json:"job"`
	Severity  string `json:"severity"`
}

type ReqCommonAnnotations struct {
	Description string `json:"description"`
	Summary     string `json:"summary"`
}

func ParseJson(c *gin.Context) {
	// 解析AlertManager 传递的 json 数据
	var json RequestBody
	// 将数据解析到结构体中
	if err := c.ShouldBindJSON(&json); err != nil {
		// 返回错误信息
		c.JSON(http.StatusBadRequest, gin.H{
			"error": err.Error(),
		})
		return
	}

	// 遍历json中alerts数据
	println(json.CommonLabels.Alertname)
	println(json.ExternalURL)
	//for _, v := range json.Alert {
	//	//print(v.Fingerprint)
	//	if json.CommonLabels.Alertname == "target_down" {
	//		fmt.Printf("fingerprint: %s,fingerprint: %s, status: %s, start_at: %s, end_at: %s \n",
	//			v.Fingerprint, v.Labels.Alertname, v.Status, v.StartsAt, v.EndsAt)
	//		fmt.Printf("GeneratorURL: %s,Instance: %s, Job: %s\n",
	//			v.GeneratorURL, v.Labels.Instance, v.Labels.Job)
	//	}
	//
	//	// TODO 存入数据库
	//	// TODO 进行check
	//}

	// 返回给客户端的消息
	c.JSON(http.StatusOK, gin.H{
		"msg": "success",
	})
}

func main() {
	router := gin.Default()
	router.POST("/api/v2/alerts", ParseJson)
	_ = router.Run(":8080")
}
